//
//  WBHomeViewController.swift
//  TYCWeiBo
//
//  Created by 中发 on 2018/5/29.
//  Copyright © 2018年 中发. All rights reserved.
//
/**
 缓存行高的步奏：
 1.打开xib/纯代码一样，按照从长致下的顺序依次罗列控件的高度公式
 2.计算杭高的方法，在视图模型中，根据公式，定义需要的常量，（间距/图标/标签视图计算大小/标签的字体；定义变量height；从上向下依次计算，不建议跳跃，不要省略计算步骤）
 3.在构造函数末尾计算行高
 4.在更新单图尺寸后再次计算，因为调整过配图视图的高度
 5.调整控制器，在base控制器，实现代理行高的方法，可随便返回一个行高。其目的是保证子类可以重写方法，否则子类行高的方法不会执行；返回在子类中重写行高方法，在视图模型中计算的行高；取消自动行高（tableView?.rowHeight = UITableViewAutomaticDimension）
 */

import UIKit

//定义全局变量，尽量使用private修饰，否则全局都可以访问
private let originCellID = "originCellId"
private let retweetedCellID = "retweetedCellId"
//private let cellId = "cellId"

class WBHomeViewController: WBBaseViewController {

    //列表视图模型
    var listViewModel = WBStatusListViewModel()
    
    override func loadData() {
        print("开始加载数据")
        
        listViewModel.loadStatus(pullUp: self.isPull) { (isSuccess, hasMorePullUp) in
            print("加载数据结束")
            //结束刷新控件
            self.refeshCtrl?.endRefreshing()
            //恢复上拉刷新标志
            self.isPull = false
            print("刷新表格")
            if hasMorePullUp {
                self.tableView?.reloadData()                
            }
        }
    }
    
    @objc private func showFriend() {
        print("#function")
        
        let v = WBDemoViewController()
        v.hidesBottomBarWhenPushed = true
        navigationController?.pushViewController(v, animated: true)
    }
    
    
}
//MARK:数据源协议方法
extension WBHomeViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //取出视图模型，根据视图模型判断可重用cell
        let vm = listViewModel.statusList[indexPath.row]
        let cellId = (vm.status.retweeted_status != nil) ? retweetedCellID : originCellID
        
        
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! WBStatusCell
        
        //设置cell
        let viewModel = listViewModel.statusList[indexPath.row]
        cell.viewModel = viewModel
        //设置代理，如果用block需要在数据源方法中，给每个cell设置block，cell。completionBlock = ^{...}。设置代理只是传递了一个指针地址
        cell.delegate = self
        //回调cell
        return cell
    }
    //父类没有实现，子类就不会重写，此状况在Swift2.0没有，在3.0以后就出现了。
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        //1.根据IndexPath获取视图模型
        let vm = listViewModel.statusList[indexPath.row]
        //2.返回计算好的行高
        return vm.rowHeight
    }
}

extension WBHomeViewController: WBStatusCellDelegate{
    func statusCellDidSelectedURLString(cell: WBStatusCell, urlString: String) {
        print(urlString)
        let vc = WBWebViewController()
        vc.urlString = urlString
        navigationController?.pushViewController(vc, animated: true)
    }
}
// MARK: - 设置界面
extension WBHomeViewController {
    
    /// 重写父类方法
    override func setTableView() {
        super.setTableView()
        //设置导航栏按钮
        navItem.leftBarButtonItem = UIBarButtonItem(title: "好友", style: .plain, target: self, action: #selector(showFriend))
        //注册原型cell
//        tableView?.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
        
        tableView?.register(UINib(nibName: "WBStatusNomalCell", bundle: nil), forCellReuseIdentifier: originCellID)
        tableView?.register(UINib(nibName: "WBStatusRetweetedCell", bundle: nil), forCellReuseIdentifier: retweetedCellID)
//        tableView?.rowHeight = UITableViewAutomaticDimension
        tableView?.estimatedRowHeight = 300
        //取消分割线
        tableView?.separatorStyle = .none
        setUpNavTitle()
    }
    
    private func setUpNavTitle() {
        
        let title = WBNetworkManager.shared.userAccount.screen_name
        
        let button = WBTitleButton(title: title)
        navItem.titleView?.addSubview(button)
        button.addTarget(self, action: #selector(clickTitleButton), for: .touchUpInside)
        
    }
    @objc func clickTitleButton(btn: UIButton) {
        //设置选中状态
        btn.isSelected = !btn.isSelected
    }
}


